<?php

namespace App\Console\Commands;

use App\Models\AdminModule;
use App\Models\ContentTemplateModel;
use Illuminate\Console\Command;
use Spatie\Permission\Models\Permission;

class ModuleCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'dh-module';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '初始化系统模块儿数据';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //目的是初始化系统模块儿数据
        //系统所有模块儿都存放在app/Http/Controllers目录中,但并不是该目录下的每个文件夹都是一个模块儿
        foreach (glob('app/Http/Controllers/*') as $value){
            if ($this->isModule($value)):
                //如果当前判断的是一个模块儿就获取相关信息,并写入admin_modules表中
               $modules = $this->getInfo($value);
            //在$modules数组中新增一个config键名,用来存放当前模块儿中的配置文件里面的信息
                $modules['config'] = $modules;
                //在$modules数组中新增一个module键名,用来存放当前模块儿
                $modules['module'] = basename($value);
                //通过调用方法获取模块儿的permission权限信息
                $modules['permission'] = $this->getPermission($value);

                AdminModule::firstOrNew(['module'=>$modules['module']])->fill($modules)->save();
                //将模块儿权限添加到permissions权限表中
                $this->permission($value);
            endif;
        }
        //调用ContentTemplateModel模型中的方法,刷新系统中的模板template,并选中系统默认模板
        (new ContentTemplateModel)->loadTemplate()->first()->fill(['using'=>true])->save();
        //执行到这里说明数据已经存到数据库中了
        $this->info('初始化模块儿数据成功');
    }

    //判断传递过来的路径是不是一个模块儿的方法
    protected function isModule(string $path):bool
    {
        return is_file($path.'/config/app.php');
    }

    //读取模块儿信息(app.php文件)的方法
    protected function getInfo(string $path){
        return include $path.'/config/app.php';


    }

    //获取模块儿的permission权限信息
    protected function getPermission(string $path){
        //模块儿中有权限配置文件就获取权限配置文件中的内容,没有权限配置文件就返回一个空数组
        if (is_file($path.'/config/permission.php')) {
            $permissions = include $path . '/config/permission.php';
            //为了避免不同模块儿权限重名,在往数据库中添加的时候在模块儿权限前面加上模块儿的目录名
            foreach ($permissions as $k => $permission) {
                $permissions[$k]['name'] = basename($path) . '-' . $permission['name'];
            }
            return $permissions;
        }
        else  return [];
    }
    //将模块儿权限添加到permision权限表中
    protected function permission($name){
        //通过调用getPermission()方法获取在权限前面加上对应模块儿的权限数组
        $permission =  $this->getPermission($name);
        //将模块儿中的权限依次写入permission表中
        foreach ($permission as $value){
            //Permission模型通过调用firstOrNew方法,按照'name'=$value['name']条件进行查找,如果找到就返回这条Permission对象,如果没有找到就new实例化一个permission对象,然后通过调用模型的fill($value)方法,将$value这个属性数组填充到前面的模型中,之后调用save()方法将前面Permission对象中的属性写入关联模型中
            Permission::firstOrNew(['name'=>$value['name']])->fill($value)->save();
        }
    }

}
